package com.wyp.animationdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.graphics.drawable.AnimationDrawable;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

/**
 * 1、逐帧动画
 *      1）准备好图片资源，然后在res中的drawable中定义animation-list的item，引用图片和设置持续时间
 *      2）在ImageView的background设置为1)中定义的逐帧动画
 *      3）在代码中获取AnimationDrawable实例，通过ImageView.getBackground()来获取
 *      4）然后通过animationDrawable实例的start和stop方法来实现逐帧动画。
 * 2、补间动画:
 *      缩放ScaleAnimation、平移TranslateAnimation、旋转RotateAnimation以及透明度AlphaAnimation
 *      1）定义动画：定义好动画xml文件，在res新建anim资源目录，然后定义四种或者综合set集合
 *      2）获取动画实例：通过AnimationUtils.loadAnimation(context,R.anim.anim_set)获取animation实例，
 *      3）开启动画：设置animation的一些属性，比如FillAfter，保留最后一帧，最后imageView.startAnimation(animation)。
 * 3、属性动画
 *      分为值动画ValueAnimator（构造函数传入变化的值）和对象动画ObjectAnimator（继承自值动画，构造函数可传入对象、属性名及变化的值）
 *      1）获取动画实例，给实例设置一些属性比如持续时间、是否保留最后一帧、重复次数和方式等
 *      2) 设置更新监听，在onAnimationUpdate方法内获取value值，然后可以设置旋、移、缩、透的动画属性值。
 *      3) 开启动画
 */
public class MainActivity extends AppCompatActivity {

    private ImageView iv_frame_anim;
    private ImageView iv_tween_anim;
    private ImageView iv_value_anim;
    private ImageView iv_object_anim;
    private ImageView iv_set_anim;

    private View mView;

    private AnimationDrawable animationDrawable;

    private Animation animation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        iv_frame_anim = findViewById(R.id.iv_frame_anim);
        iv_tween_anim = findViewById(R.id.iv_tween_anim);
        iv_value_anim = findViewById(R.id.iv_value_anim);
        iv_object_anim = findViewById(R.id.iv_object_anim);
        iv_set_anim = findViewById(R.id.iv_set_anim);

        mView = findViewById(R.id.view);

        //ImageView的背景为动画，通过ImageView的背景来获取动画
        animationDrawable = (AnimationDrawable) iv_frame_anim.getBackground();

        //animation = AnimationUtils.loadAnimation(this,R.anim.rotate_anim);
        //animation = AnimationUtils.loadAnimation(this,R.anim.alpha_anim);
        //animation = AnimationUtils.loadAnimation(this,R.anim.scale_anim);
        //animation = AnimationUtils.loadAnimation(this,R.anim.translate_anim);
        animation = AnimationUtils.loadAnimation(this,R.anim.anim_set);
        animation.setFillAfter(true); //设置保留最后一帧

    }

    public void onClickStart(View view) {
        //逐帧动画开始
        animationDrawable.start();
        //补间动画开始
        iv_tween_anim.startAnimation(animation);

    }

    public void onClickStop(View view) {
        animationDrawable.stop();


    }

    //值动画
    public void valueAnimator(View view) {
        //没有属性，及对象
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(0F,400F);//从原来位置移动到400位置
        valueAnimator.setTarget(iv_value_anim);
        valueAnimator.setDuration(3000);
        //valueAnimator.setStartDelay(300);//延迟播放
        valueAnimator.setRepeatCount(-1);//重放次数
        valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
        //重放模式
        //ValueAnimator.START：正序
        //ValueAnimator.REVERSE：倒序

        //设置更新监听
        //值 改变一次，该方法就执行一次
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (Float) animation.getAnimatedValue();  //value应该是根据设置的offFloat值变化的
                iv_value_anim.setTranslationX(value);
                iv_value_anim.setRotation(value);

            }
        });
        valueAnimator.start();

    }

    //对象动画
    public void objectAnimator(View view) {
        //参数说明：第一个，使用动画的对象；第二个，属性名；第三个，变化的值float...数组型
//        ObjectAnimator.ofFloat(iv_object_anim,"alpha",0F,1F)
//                .setDuration(3000)
//                .start();

        //属性名任意时，不起任何效果
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv_object_anim,"alpha",0F,1F);
        objectAnimator.setDuration(3000);
        //此处也是ValueAnimator.AnimatorUpdateListener(){}
        objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (Float) animation.getAnimatedValue();
                iv_object_anim.setScaleX(value);
                iv_object_anim.setScaleY(value);
                iv_object_anim.setAlpha(value); //或者将aaa改为alpha
            }
        });
        objectAnimator.start();

    }

    /**
     * 透明动画(AlphaAnimation)、旋转动画(RotateAnimation)、移动动画(TranslateAnimation)和缩放动画(ScaleAnimation)
     * AnimationSet几个常用方法
     * 构造函数     boolean interpolator    true：代表使用默认的interpolator  false：代表使用自定义interpolator
     * addAnimation     Animation a     添加定义好的动画效果
     * setDuration    long time         设置播放时长（毫秒）
     * setRepeatCount     int count    设置重复次数
     * setRepeatMode    int repeatMode  设置重放模式
     * setFillAfter     boolean b       是否保持动画完成后的位置
     * setFillBefore    boolean b       是否保持动画开始时的状态
     * cancel       无       取消AnimationSet
     * reset        无       释放AnimationSet
     *
     */
    //集合动画，综合使用
    //在属性动画中如果定义为无限循环，如果在Activity中播放这类动画并且在其退出（生命周期结果前）未停止动画，造成内存泄漏。
    //clearAnimation、stop、cancel
    //动画暂停与继续？
    public void setAnimator(View view) {

        //构造方法的入参如果是“true”，则代表使用默认的interpolator，如果是“false”则代表使用自定义interpolator
        AnimationSet animationSet=new AnimationSet(false);

        //透明度从0至1
        AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
        alphaAnimation.setRepeatCount(-1);
        alphaAnimation.setRepeatMode(Animation.REVERSE);

        //旋转两圈
        RotateAnimation rotateAnimation=new RotateAnimation(0, 720,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        rotateAnimation.setRepeatCount(-1);
        rotateAnimation.setRepeatMode(Animation.REVERSE);

        //放大十倍
        ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 10, 1f, 10,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        scaleAnimation.setRepeatCount(-1);//负数表示无穷
        scaleAnimation.setRepeatMode(Animation.REVERSE);

        //平移距离x方向为父控件宽的30.5%,y方向为父控件高的30.5%
        TranslateAnimation translateAnimation=new TranslateAnimation(
                Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_PARENT, 0.305f,
                Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_PARENT, 0.305f);
        translateAnimation.setRepeatCount(-1);
        translateAnimation.setRepeatMode(Animation.REVERSE);

        animationSet.addAnimation(alphaAnimation);
        animationSet.addAnimation(rotateAnimation);
        animationSet.addAnimation(scaleAnimation);
        animationSet.addAnimation(translateAnimation);
        //设置动画时长为3秒
        animationSet.setDuration(3000);
        //animationSet.setRepeatCount(50);这样设置无效
        animationSet.setRepeatMode(AnimationSet.REVERSE);
        //设置插值器为先加速再减速
        animationSet.setInterpolator(new AccelerateDecelerateInterpolator());
        //动画完成后保持位置
        animationSet.setFillAfter(false);
        //保持动画开始时的状态
        animationSet.setFillBefore(true);
        //取消动画
        animationSet.cancel();
        //释放资源
        animationSet.reset();
        //开始动画
        iv_set_anim.startAnimation(animationSet);
    }


    //链式调用方式
    public void other(View view) {

        mView.animate()
                .translationY(-mView.getTop()-mView.getHeight()+20)
                .setDuration(3000)
                .alpha(0.5F)
                .rotation(1800)
                .setInterpolator(new AccelerateDecelerateInterpolator())
                .start();
    }
}


























